Firebird - posahana databaza koli charset

Otázka od: Martin Matous

6. 5. 2004 8:43

Dobry den,

  na linuxe je FB1.5 s charset WIN1250
  klient sa pripaja tiez cez charset WIN1250

  vsetko bolo ok, az teraz pri
  SELECT * FROM TABULKA
  vrati mi chybu:
  
"Arithmetic overflow or division by zero has occurred.arithmetic exception, numeric overflow, or string truncation.
  Cannot transliterate character between character sets."

  Nasiel som ten zaznam v ktorom je chyba, je to ID_TABULKA=1522
  Takze ak zavolam
  SELECT * FROM TABULKA WHERE ID_TABULKA<>1522
  uz sa chyba neobjavi, ale samozrejme bez zaznamu 1522

  Neviem ako mam opravit ten zaznam, neviem sa na neho dostat, stale
  dostanem chybu. Skusal som meni charset na strane klienta, nepomaha.
  Ani neviem ako to vzniklo, len predpokladam, ze niekto zapisal do
  VARCHAR nejaku hodnotu ktora je mimo CHARSET.

  Moze to vzniknut aj tym, ze nie kazde pole typu VARCHAR ma nastaveny
  CHARSET ???

  Prosim pomozte. Nechcem vsat ten zaznam mazat cez DELETE a potom
  znovu vytvorit. To som skusil, tak to zbehne.
  Ale chcem predist tomu do buducna !

  Dakujem vopred za pomoc.

  MartinM.



----------
* www.inMail.cz - Vase emailova adresa na cely zivot ZDARMA
* www.czechia.com - profesionalni webhosting a registrace domen za vyhodne ceny
* Zoner Media Explorer 6 - Poznejte kouzlo digitalni fotografie!
(http://www.zoner.cz/zme6)


Odpovedá: Pavel Cisar

6. 5. 2004 9:31

Haj hou!

On 6 May 2004 at 8:58, Martin Matous wrote:

> Neviem ako mam opravit ten zaznam, neviem sa na neho dostat, stale
> dostanem chybu. Skusal som meni charset na strane klienta, nepomaha.
> Ani neviem ako to vzniklo, len predpokladam, ze niekto zapisal do
> VARCHAR nejaku hodnotu ktora je mimo CHARSET.

Pokud nevis v jakem kodovani je hodnota v danem zaznamu, tak to
opravis jen pres UPDATE nebo DELETE. Zkus nejprve UPDATE a placni tam
prazdny retezec, a pak tam dej spravny ve spravnem kodovani.

> Moze to vzniknut aj tym, ze nie kazde pole typu VARCHAR ma nastaveny
> CHARSET ???

Pokud mas definovany charset na urovni cele databaze, tak ne. Pokud
nemas, pak jsou zrejme nektere polozky v charsetu NONE. Over si to.

> Prosim pomozte. Nechcem vsat ten zaznam mazat cez DELETE a potom
> znovu vytvorit. To som skusil, tak to zbehne.
> Ale chcem predist tomu do buducna !

Pokud by byla polozka v charsetu NONE, a ty vis ze data jsou v
charsetu WIN1250, melo by to jit opravit pres ulozenou proceduru s
konverzi pres charset OCTETS.

CREATE PROCEDURE FIXME
AS
DECLARE VARIABLE SN VARCHAR(<delka_polozky>) CHARACTER SET NONE;
DECLARE VARIABLE SW VARCHAR(<delka_polozky>) CHARACTER SET WIN1250;
begin
 SELECT <spatny_sloupec> FROM TABULKA WHERE ID_TABULKA=1522 into :SN;
 SW = CAST(SN AS CHAR(<delka_polozky>) CHARACTER SET OCTETS);
 UPDATE TABULKA SET <spatny_sloupec> = :SW WHERE ID_TABULKA=1522;
end

Tohle pisu z hlavy, takze si to pripadne uprav. Za nic nerucim, a
experimenty provadej na kopii databaze.

S pozdravem
Pavel Cisar ( ICQ: 89017288)
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase